package com.gl.admin.controller;


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gl.admin.entity.SysFiles;
import com.gl.admin.exception.ServiceException;
import com.gl.admin.service.SysFileService;
import com.gl.admin.common.HttpsStatus;
import com.gl.admin.common.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  文件管理前端控制器
 * </p>
 *
 * @author 晚风
 * @since 2023-03-23
 */
@RestController
@RequestMapping("/api/file")
@Api("文件管理")
public class SysFilesController {
    //获取配置文件定义的文件上传地址
    @Value("${files.upload.path}")
    private String uploadPath;

    //获取配置文件定义的文件访问根地址
    @Value("${files.server.ip}")
    private String serverip;

    @Resource
    private SysFileService sysFileService;

    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public Result upload(@RequestBody MultipartFile file) throws IOException {
        // 获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        // 生成一个文件
        File uploadParentFileFile = new File(uploadPath + originalFilename);
        File parentFile = uploadParentFileFile.getParentFile(); // 获取目录
        //判断文件目录是否存在
        if (!parentFile.exists()) {//   如果不存在该目录就创建
            parentFile.mkdirs();
        }
        // 如果文件存在
        if (uploadParentFileFile.exists()){
            //就覆盖当前文件
            FileWriter fileWriter = new FileWriter(uploadParentFileFile,true);
        }else {
            //  不存在就 把获取的文件存储到磁盘目录中
            file.transferTo(uploadParentFileFile);
        }
        //根据文件名获取类型
        String type = FileUtil.extName(originalFilename);
        // 文件url
        String url = serverip + "/api/file/xz/" + originalFilename;
        long size = file.getSize(); // 文件大小
        String md5 = md5 = SecureUtil.md5(uploadParentFileFile); //md5
        //创建一个文件实体类
        SysFiles sysFiles = new SysFiles();
        sysFiles.setName(originalFilename);
        sysFiles.setMd5(md5);
        sysFiles.setUrl(url);
        sysFiles.setSize(size/1024);
        sysFiles.setType(type);
        sysFiles.setEnable(false);
        sysFiles.setIsDelete(false);
        //根据md5查询文件
        QueryWrapper<SysFiles> queryWrapper = new QueryWrapper<>();
        //根据
        queryWrapper.eq("md5", md5);
        SysFiles one = sysFileService.getOne(queryWrapper);
        //判断文件是否存在
        if (one != null){
            sysFiles.setId(one.getId());
            sysFileService.updateById(sysFiles);
        }else {
            sysFileService.save(sysFiles);//  添加一条记录到数据库中

        }
        //  返回文件的网络虚拟路径
        return Result.success(url);
    }

    @GetMapping("/xz/{fileName}")
    @ApiOperation(value = "下载文件，在线访问网络图片")
    public void download(@ApiParam(value = "文件虚拟地址") @PathVariable String fileName, HttpServletResponse response) {
        try {
            // 根据文件路径加文件名获取查询文件
            File file = new File(uploadPath + "/" + fileName);
            //根据md5查询文件
            QueryWrapper<SysFiles> queryWrapper = new QueryWrapper<>();
            //根据文件的md5查询文件信息
            queryWrapper.eq("md5", SecureUtil.md5(file));
            SysFiles one = sysFileService.getOne(queryWrapper);
            //如果文件存在
            if (one != null) {
                //判断是否被假删除
                if (one.getIsDelete()) {
                    throw new ServiceException(HttpsStatus.CODE_500,"该文件已经被删除，请联系管理员");
                }
                //判断文件是否被禁用
                if (one.getEnable()) {
                    throw new ServiceException(HttpsStatus.CODE_500,"该文件链接已失效");
                }
            }else {
                //
                throw new ServiceException(HttpsStatus.CODE_500,"该文件已不存在与数据库中");
            }
            // 创建一个流
            ServletOutputStream out = response.getOutputStream();
            //文件输出格式
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setContentType("application/octet-stream");
            // 读取文件字节流
            byte[] bytes = FileUtil.readBytes(file);
            // 输出一个字节流
            out.write(bytes);
            //关闭流
            out.flush();
            out.close();
        }catch (Exception e) {
            throw new ServiceException(HttpsStatus.CODE_500,"文件不存在，请上传文件");
        }
    }


}

